---
title: 程序设计语言基础
description: 基本概念、基本成分
---
## 基本概念

程序设计语言是为了书写计算机程序而人为设计的符号语言，用于对计算过程进行描述、组织和推导。


分为两种：
* 低级语言：<RedSpan>机器语言（计算机硬件只能识别 0 和 1 的指令序列），汇编语言</RedSpan>。
* 高级语言：功能更强、抽象级别更高，<RedSpan>与人们所使用的自然语言比较接近</RedSpan>。

各程序设计语言特点：
* Fortran 语言：科学计算，执行效率高。
* Pascal 语言：为教学开发，表达能力强。
* C 语言：指针操作能力强，可以开发系统级软件，高效。
* C++ 语言：面向对象，高效。
* Java ：面向对象，中间代码，跨平台。
* C# :面向对象，中间代码，.Net 框架。
* Python：面向对象，解释型计算机程序设计语言。
* prolog： 逻辑型程序设计语言。


汇编： 将<RedSpan>汇编程序翻译成目标程序</RedSpan>执行。

解释和编译：<RedSpan>将高级语言进行执行</RedSpan>，不同之处在于 <RedSpan>编译程序生成独立的可执行文件；直接运行，运行时无法控制源程序，效率高。</RedSpan>而<RedSpan>解释程序不生成可执行文件，可以逐行解释执行，用于调试模式，可以控制源程序，</RedSpan>因为还需要控制程序，因此 <RedSpan>执行速度慢，效率低</RedSpan>。


:::tip
解释性语言也称为脚本语言。
:::

程序设计语言三要素：<RedSpan>语法、语义、语用</RedSpan>
* 语法是指由程序设计语言的基本符号组成程序中的 <RedSpan>各个语法成分（包括程序）的一组规则</RedSpan>，其中 <RedSpan>由基本字符构成的符号（单词）书写的规则称为词法规则，由符号构成的语法成分的规则称为语法规则。</RedSpan>
* 语义是程序设计语言中 <RedSpan>按语法规则构成的各个语法成分的含义</RedSpan>，可分为静态语义和动态语义。<RedSpan>静态语义指编译时可以确定的语法成分的含义，而运行时刻才能确定的含义是动态语义</RedSpan>。一个程序的执行效果说明了该程序的语义，它取决于构成程序的各个组成部分的语义。
* 语用表示了<RedSpan>构成语言的各个记号和使用者之间的关系</RedSpan>，涉及符号的来源、使用和影响。

<RedSpan>语言的实现则有个语境问题。</RedSpan>语境是指理解和实现程序设计语言的环境，包括编译环境和运行环境。

## 程序设计语言的分类
1. <RedSpan>命令式和结构化程序设计语言</RedSpan>：包括Fortran、Pascal 和 C 语言。
2. <RedSpan>面向对象程序设计语言</RedSpan>：包括 C++、Java、C#、Python、Smalltalk
3. <RedSpan>函数式程序设计语言</RedSpan>：包括 LISP、Haskell、Scala、Scheme、APL 等。
4. <RedSpan>逻辑型程序设计语言</RedSpan>： prolog。

## <RedSpan>程序设计语言的基本成分</RedSpan>

### <RedSpan>数据部分</RedSpan>
指一种程序设计语言的 <RedSpan>数据和数据类型</RedSpan>。数据分为 <RedSpan>常量（程序运行时不可改变）、变量（程序运行时可改变）、全局量（存储空间在静态数据区分配）、局部量（存储空间在堆栈区分配）</RedSpan>。
数据类型有整型、字符型、单精度（双精度）浮点型、布尔型等。

### <RedSpan>运算成分</RedSpan>

指明<RedSpan>允许使用的运算符号及运算规则。</RedSpan>包括算术运算、逻辑运算、关系运算、位运算等。

### <RedSpan>控制成分</RedSpan>
指明 <RedSpan>语言允许表述的控制结构。</RedSpan>包括 <RedSpan>顺序、选择、循环</RedSpan>结构。如下图所示：


<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241101000157.png"/>


### <RedSpan>传输成分</RedSpan>

指明<RedSpan>语言允许的数据传输方式</RedSpan>。如赋值处理、数据的输入输出等。



### <RedSpan>函数</RedSpan>

c 程序由一个或多个函数组成，每个函数都有一个名字，其中 <RedSpan>有且仅有一个名字为 main 的函数作为程序运行的起点</RedSpan>。函数的使用涉及 3 个概念：<RedSpan>函数定义、函数声明和函数调用</RedSpan>。

函数的定义包含两部分：<RedSpan>函数首部和函数体</RedSpan>。函数的定义描述了函数做什么和怎么做。<RedSpan>函数定义的一般形式为</RedSpan>：
```java
返回值类型 函数名(形式参数列表)// 函数首部
{
  函数体;
}
```
 函数首部定义了函数返回值的数据类型、函数的名字和函数运行时所需的参数及类型。函数所实现的功能在函数体部分进行描述。

函数应该 <RedSpan>先声明后引用</RedSpan>。如果程序中对一个函数的调用在该函数的定义之前进行，则应该在调用前对被调用函数进行声明。<RedSpan>函数原型用于声明函数，函数声明的一般形式为：</RedSpan>
```java
返回值类型 函数名(参数类型表);
```

函数调用的一般形式为：
```
函数名（实参表）
```
函数调用时 <RedSpan>实参与形参间交换信息的方法有值调用和引用调用两种</RedSpan>。
* <RedSpan>值调用（Call by Value）</RedSpan>: 若实现函数调用时将 <RedSpan>实参的值传递给相应的形参</RedSpan>，则称为是传值调用，在这种方式下形参不能向实参传递消息。在 C 语言中，<RedSpan>要实现被调用函数对实参的修改，必须用指针作为参数</RedSpan>。即调用时需要先对实参进行 <RedSpan>取地址运算</RedSpan>。然后将实参的地址传递给指针形参，<RedSpan>其本质上仍属于值调用，这种方式实现了间接内存访问</RedSpan>。
* <RedSpan>引用调用（Call by Reference）</RedSpan>：引用是 C++ 中引入的概念，当形式参数为引用类型时，形参名实际上是实参的别名。函数中对形参的访问和修改实际上就是针对相应实参所做的访问和改变。



